<?php
/*
汉字转化为拼音类
 */
class pinyin_lib {

    /**
     * 汉字ASCII码库
     *
     * @var array
     */
    protected $lib;


    /**
     * 构造函数
     *
     * @return void
     */
    public function __construct() {

    }

    /**
     * 汉字转化并输出拼音
     *
     * @param string $str        所要转化拼音的汉字
     * @param boolean $utf8     汉字编码是否为utf8
     * @return string
     */
    public function output( $str, $utf8 = true ) {
        //参数分析
        if ( !$str ) {
            return false;
        }

        //编码转换.
        $str = ( $utf8 == true ) ? $this->iconvStr( 'utf-8', 'gbk', $str ) : $str;
        $num = strlen( $str );

        $pinyin = '';
        for ( $i = 0; $i < $num; $i++ ) {
            $temp = ord( substr( $str, $i, 1 ) );
            if ( $temp > 160 ) {
                $temp2 = ord( substr( $str, ++$i, 1 ) );
                $temp = $temp * 256 + $temp2 - 65536;
            }
            $pinyin .= $this->num2str( $temp );
        }

        //输出的拼音编码转换.
        return ( $utf8 == true ) ? $this->iconvStr( 'gbk', 'utf-8', $pinyin ) : $pinyin;
    }

    /**
     * 将ASCII编码转化为字符串.
     *
     * @param integer $num
     * @return string
     */
    protected function num2str( $num ) {

        if ( !$this->lib ) {
            $this->parse_lib();
        }

        if ( $num > 0 && $num < 160 ) {

            return chr( $num );
        } elseif ( $num < -20319 || $num > -10247 ) {

            return '';
        } else {
            $total = sizeof( $this->lib ) - 1;
            for ( $i = $total; $i >= 0; $i-- ) {
                if ( $this->lib[ $i ][ 1 ] <= $num ) {
                    break;
                }
            }

            return $this->lib[ $i ][ 0 ];
        }
    }

    /**
     * 返回汉字编码库
     *
     * @return array
     */
    protected function parse_lib() {

        return $this->lib = array(
            array( "a", -20319 ),
            array( "ai", -20317 ),
            array( "an", -20304 ),
            array( "ang", -20295 ),
            array( "ao", -20292 ),
            array( "ba", -20283 ),
            array( "bai", -20265 ),
            array( "ban", -20257 ),
            array( "bang", -20242 ),
            array( "bao", -20230 ),
            array( "bei", -20051 ),
            array( "ben", -20036 ),
            array( "beng", -20032 ),
            array( "bi", -20026 ),
            array( "bian", -20002 ),
            array( "biao", -19990 ),
            array( "bie", -19986 ),
            array( "bin", -19982 ),
            array( "bing", -19976 ),
            array( "bo", -19805 ),
            array( "bu", -19784 ),
            array( "ca", -19775 ),
            array( "cai", -19774 ),
            array( "can", -19763 ),
            array( "cang", -19756 ),
            array( "cao", -19751 ),
            array( "ce", -19746 ),
            array( "ceng", -19741 ),
            array( "cha", -19739 ),
            array( "chai", -19728 ),
            array( "chan", -19725 ),
            array( "chang", -19715 ),
            array( "chao", -19540 ),
            array( "che", -19531 ),
            array( "chen", -19525 ),
            array( "cheng", -19515 ),
            array( "chi", -19500 ),
            array( "chong", -19484 ),
            array( "chou", -19479 ),
            array( "chu", -19467 ),
            array( "chuai", -19289 ),
            array( "chuan", -19288 ),
            array( "chuang", -19281 ),
            array( "chui", -19275 ),
            array( "chun", -19270 ),
            array( "chuo", -19263 ),
            array( "ci", -19261 ),
            array( "cong", -19249 ),
            array( "cou", -19243 ),
            array( "cu", -19242 ),
            array( "cuan", -19238 ),
            array( "cui", -19235 ),
            array( "cun", -19227 ),
            array( "cuo", -19224 ),
            array( "da", -19218 ),
            array( "dai", -19212 ),
            array( "dan", -19038 ),
            array( "dang", -19023 ),
            array( "dao", -19018 ),
            array( "de", -19006 ),
            array( "deng", -19003 ),
            array( "di", -18996 ),
            array( "dian", -18977 ),
            array( "diao", -18961 ),
            array( "die", -18952 ),
            array( "ding", -18783 ),
            array( "diu", -18774 ),
            array( "dong", -18773 ),
            array( "dou", -18763 ),
            array( "du", -18756 ),
            array( "duan", -18741 ),
            array( "dui", -18735 ),
            array( "dun", -18731 ),
            array( "duo", -18722 ),
            array( "e", -18710 ),
            array( "en", -18697 ),
            array( "er", -18696 ),
            array( "fa", -18526 ),
            array( "fan", -18518 ),
            array( "fang", -18501 ),
            array( "fei", -18490 ),
            array( "fen", -18478 ),
            array( "feng", -18463 ),
            array( "fo", -18448 ),
            array( "fou", -18447 ),
            array( "fu", -18446 ),
            array( "ga", -18239 ),
            array( "gai", -18237 ),
            array( "gan", -18231 ),
            array( "gang", -18220 ),
            array( "gao", -18211 ),
            array( "ge", -18201 ),
            array( "gei", -18184 ),
            array( "gen", -18183 ),
            array( "geng", -18181 ),
            array( "gong", -18012 ),
            array( "gou", -17997 ),
            array( "gu", -17988 ),
            array( "gua", -17970 ),
            array( "guai", -17964 ),
            array( "guan", -17961 ),
            array( "guang", -17950 ),
            array( "gui", -17947 ),
            array( "gun", -17931 ),
            array( "guo", -17928 ),
            array( "ha", -17922 ),
            array( "hai", -17759 ),
            array( "han", -17752 ),
            array( "hang", -17733 ),
            array( "hao", -17730 ),
            array( "he", -17721 ),
            array( "hei", -17703 ),
            array( "hen", -17701 ),
            array( "heng", -17697 ),
            array( "hong", -17692 ),
            array( "hou", -17683 ),
            array( "hu", -17676 ),
            array( "hua", -17496 ),
            array( "huai", -17487 ),
            array( "huan", -17482 ),
            array( "huang", -17468 ),
            array( "hui", -17454 ),
            array( "hun", -17433 ),
            array( "huo", -17427 ),
            array( "ji", -17417 ),
            array( "jia", -17202 ),
            array( "jian", -17185 ),
            array( "jiang", -16983 ),
            array( "jiao", -16970 ),
            array( "jie", -16942 ),
            array( "jin", -16915 ),
            array( "jing", -16733 ),
            array( "jiong", -16708 ),
            array( "jiu", -16706 ),
            array( "ju", -16689 ),
            array( "juan", -16664 ),
            array( "jue", -16657 ),
            array( "jun", -16647 ),
            array( "ka", -16474 ),
            array( "kai", -16470 ),
            array( "kan", -16465 ),
            array( "kang", -16459 ),
            array( "kao", -16452 ),
            array( "ke", -16448 ),
            array( "ken", -16433 ),
            array( "keng", -16429 ),
            array( "kong", -16427 ),
            array( "kou", -16423 ),
            array( "ku", -16419 ),
            array( "kua", -16412 ),
            array( "kuai", -16407 ),
            array( "kuan", -16403 ),
            array( "kuang", -16401 ),
            array( "kui", -16393 ),
            array( "kun", -16220 ),
            array( "kuo", -16216 ),
            array( "la", -16212 ),
            array( "lai", -16205 ),
            array( "lan", -16202 ),
            array( "lang", -16187 ),
            array( "lao", -16180 ),
            array( "le", -16171 ),
            array( "lei", -16169 ),
            array( "leng", -16158 ),
            array( "li", -16155 ),
            array( "lia", -15959 ),
            array( "lian", -15958 ),
            array( "liang", -15944 ),
            array( "liao", -15933 ),
            array( "lie", -15920 ),
            array( "lin", -15915 ),
            array( "ling", -15903 ),
            array( "liu", -15889 ),
            array( "long", -15878 ),
            array( "lou", -15707 ),
            array( "lu", -15701 ),
            array( "lv", -15681 ),
            array( "luan", -15667 ),
            array( "lue", -15661 ),
            array( "lun", -15659 ),
            array( "luo", -15652 ),
            array( "ma", -15640 ),
            array( "mai", -15631 ),
            array( "man", -15625 ),
            array( "mang", -15454 ),
            array( "mao", -15448 ),
            array( "me", -15436 ),
            array( "mei", -15435 ),
            array( "men", -15419 ),
            array( "meng", -15416 ),
            array( "mi", -15408 ),
            array( "mian", -15394 ),
            array( "miao", -15385 ),
            array( "mie", -15377 ),
            array( "min", -15375 ),
            array( "ming", -15369 ),
            array( "miu", -15363 ),
            array( "mo", -15362 ),
            array( "mou", -15183 ),
            array( "mu", -15180 ),
            array( "na", -15165 ),
            array( "nai", -15158 ),
            array( "nan", -15153 ),
            array( "nang", -15150 ),
            array( "nao", -15149 ),
            array( "ne", -15144 ),
            array( "nei", -15143 ),
            array( "nen", -15141 ),
            array( "neng", -15140 ),
            array( "ni", -15139 ),
            array( "nian", -15128 ),
            array( "niang", -15121 ),
            array( "niao", -15119 ),
            array( "nie", -15117 ),
            array( "nin", -15110 ),
            array( "ning", -15109 ),
            array( "niu", -14941 ),
            array( "nong", -14937 ),
            array( "nu", -14933 ),
            array( "nv", -14930 ),
            array( "nuan", -14929 ),
            array( "nue", -14928 ),
            array( "nuo", -14926 ),
            array( "o", -14922 ),
            array( "ou", -14921 ),
            array( "pa", -14914 ),
            array( "pai", -14908 ),
            array( "pan", -14902 ),
            array( "pang", -14894 ),
            array( "pao", -14889 ),
            array( "pei", -14882 ),
            array( "pen", -14873 ),
            array( "peng", -14871 ),
            array( "pi", -14857 ),
            array( "pian", -14678 ),
            array( "piao", -14674 ),
            array( "pie", -14670 ),
            array( "pin", -14668 ),
            array( "ping", -14663 ),
            array( "po", -14654 ),
            array( "pu", -14645 ),
            array( "qi", -14630 ),
            array( "qia", -14594 ),
            array( "qian", -14429 ),
            array( "qiang", -14407 ),
            array( "qiao", -14399 ),
            array( "qie", -14384 ),
            array( "qin", -14379 ),
            array( "qing", -14368 ),
            array( "qiong", -14355 ),
            array( "qiu", -14353 ),
            array( "qu", -14345 ),
            array( "quan", -14170 ),
            array( "que", -14159 ),
            array( "qun", -14151 ),
            array( "ran", -14149 ),
            array( "rang", -14145 ),
            array( "rao", -14140 ),
            array( "re", -14137 ),
            array( "ren", -14135 ),
            array( "reng", -14125 ),
            array( "ri", -14123 ),
            array( "rong", -14122 ),
            array( "rou", -14112 ),
            array( "ru", -14109 ),
            array( "ruan", -14099 ),
            array( "rui", -14097 ),
            array( "run", -14094 ),
            array( "ruo", -14092 ),
            array( "sa", -14090 ),
            array( "sai", -14087 ),
            array( "san", -14083 ),
            array( "sang", -13917 ),
            array( "sao", -13914 ),
            array( "se", -13910 ),
            array( "sen", -13907 ),
            array( "seng", -13906 ),
            array( "sha", -13905 ),
            array( "shai", -13896 ),
            array( "shan", -13894 ),
            array( "shang", -13878 ),
            array( "shao", -13870 ),
            array( "she", -13859 ),
            array( "shen", -13847 ),
            array( "sheng", -13831 ),
            array( "shi", -13658 ),
            array( "shou", -13611 ),
            array( "shu", -13601 ),
            array( "shua", -13406 ),
            array( "shuai", -13404 ),
            array( "shuan", -13400 ),
            array( "shuang", -13398 ),
            array( "shui", -13395 ),
            array( "shun", -13391 ),
            array( "shuo", -13387 ),
            array( "si", -13383 ),
            array( "song", -13367 ),
            array( "sou", -13359 ),
            array( "su", -13356 ),
            array( "suan", -13343 ),
            array( "sui", -13340 ),
            array( "sun", -13329 ),
            array( "suo", -13326 ),
            array( "ta", -13318 ),
            array( "tai", -13147 ),
            array( "tan", -13138 ),
            array( "tang", -13120 ),
            array( "tao", -13107 ),
            array( "te", -13096 ),
            array( "teng", -13095 ),
            array( "ti", -13091 ),
            array( "tian", -13076 ),
            array( "tiao", -13068 ),
            array( "tie", -13063 ),
            array( "ting", -13060 ),
            array( "tong", -12888 ),
            array( "tou", -12875 ),
            array( "tu", -12871 ),
            array( "tuan", -12860 ),
            array( "tui", -12858 ),
            array( "tun", -12852 ),
            array( "tuo", -12849 ),
            array( "wa", -12838 ),
            array( "wai", -12831 ),
            array( "wan", -12829 ),
            array( "wang", -12812 ),
            array( "wei", -12802 ),
            array( "wen", -12607 ),
            array( "weng", -12597 ),
            array( "wo", -12594 ),
            array( "wu", -12585 ),
            array( "xi", -12556 ),
            array( "xia", -12359 ),
            array( "xian", -12346 ),
            array( "xiang", -12320 ),
            array( "xiao", -12300 ),
            array( "xie", -12120 ),
            array( "xin", -12099 ),
            array( "xing", -12089 ),
            array( "xiong", -12074 ),
            array( "xiu", -12067 ),
            array( "xu", -12058 ),
            array( "xuan", -12039 ),
            array( "xue", -11867 ),
            array( "xun", -11861 ),
            array( "ya", -11847 ),
            array( "yan", -11831 ),
            array( "yang", -11798 ),
            array( "yao", -11781 ),
            array( "ye", -11604 ),
            array( "yi", -11589 ),
            array( "yin", -11536 ),
            array( "ying", -11358 ),
            array( "yo", -11340 ),
            array( "yo", -11340 ),
            array( "yong", -11339 ),
            array( "you", -11324 ),
            array( "yu", -11303 ),
            array( "yuan", -11097 ),
            array( "yue", -11077 ),
            array( "yun", -11067 ),
            array( "za", -11055 ),
            array( "zai", -11052 ),
            array( "zan", -11045 ),
            array( "zang", -11041 ),
            array( "zao", -11038 ),
            array( "ze", -11024 ),
            array( "zei", -11020 ),
            array( "zen", -11019 ),
            array( "zeng", -11018 ),
            array( "zha", -11014 ),
            array( "zhai", -10838 ),
            array( "zhan", -10832 ),
            array( "zhang", -10815 ),
            array( "zhao", -10800 ),
            array( "zhe", -10790 ),
            array( "zhen", -10780 ),
            array( "zheng", -10764 ),
            array( "zhi", -10587 ),
            array( "zhong", -10544 ),
            array( "zhou", -10533 ),
            array( "zhu", -10519 ),
            array( "zhua", -10331 ),
            array( "zhuai", -10329 ),
            array( "zhuan", -10328 ),
            array( "zhuang", -10322 ),
            array( "zhui", -10315 ),
            array( "zhun", -10309 ),
            array( "zhuo", -10307 ),
            array( "zi", -10296 ),
            array( "zong", -10281 ),
            array( "zou", -10274 ),
            array( "zu", -10270 ),
            array( "zuan", -10262 ),
            array( "zui", -10260 ),
            array( "zun", -10256 ),
            array( "zuo", -10254 ),
        );
    }

    //编码转换
    protected function iconvStr( $from, $to, $fContents ) {
        if ( is_string( $fContents ) ) {
            if ( function_exists( 'mb_convert_encoding' ) ) {
                return mb_convert_encoding( $fContents, $to, $from );
            } else if ( function_exists( 'iconv' ) ) {
                return iconv( $from, $to, $fContents );
            } else {
                return $fContents;
            }
        }
    }

    /**
     * 析构函数
     *
     * @access public
     * @return void
     */
    public function __destruct() {
        if ( isset( $this->lib ) ) {
            unset( $this->lib );
        }
    }
}

?>